package multiplex.dataaccess.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import multiplex.dataaccess.DaoException;
import multiplex.model.Sessao;
import multiplex.model.CompraNaoMarcada;

public class CompraNaoMarcadaDao extends AbstractDao implements ICompraDao<CompraNaoMarcada>{
	public CompraNaoMarcada get(int id) throws DaoException{
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Compra c, CompraNaoMarcada cnm WHERE c.id = cnm.Compra_id AND id =?");
			st.setInt(1, id);		
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				CompraNaoMarcada compraNaoMarcada = new CompraNaoMarcada(); 
				fillCompra(compraNaoMarcada, rs);
				st.close();
				return compraNaoMarcada;
			}
		} catch(Exception e){
			throw new DaoException(e);
		}
		return null;
	}
	public List<CompraNaoMarcada> getAll() throws DaoException{
		List<CompraNaoMarcada> comprasNaoMarcadas = new ArrayList<CompraNaoMarcada>();
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Compra c, CompraNaoMarcada cnm");
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				CompraNaoMarcada compraNaoMarcada = new CompraNaoMarcada(); 
				fillCompra(compraNaoMarcada, rs);
				comprasNaoMarcadas.add(compraNaoMarcada);
			}
			st.close();
		} catch(Exception e){
			throw new DaoException(e);
		}
		return comprasNaoMarcadas;
	}
	public List<CompraNaoMarcada> getAllFromSessao(Sessao sessao) throws DaoException{
		List<CompraNaoMarcada> comprasNaoMarcadas = new ArrayList<CompraNaoMarcada>();
		try{
			PreparedStatement st = getConnection().prepareStatement("SELECT * FROM Compra c, CompraNaoMarcada cnm WHERE  cnm.Compra_id = c.id AND c.Sessao_id=?");
			st.setInt(1,sessao.getId());
			ResultSet rs = st.executeQuery();
			if(rs.next()){
				CompraNaoMarcada compraNaoMarcada = new CompraNaoMarcada(); 
				fillCompra(compraNaoMarcada, rs);
				comprasNaoMarcadas.add(compraNaoMarcada);
			}
			st.close();
		} catch(Exception e){
			throw new DaoException(e);
		}
		return comprasNaoMarcadas;
	}
	public void save(CompraNaoMarcada compraNaoMarcada) throws DaoException{
		try{
			PreparedStatement st = getConnection().prepareStatement(
					"INSERT INTO Compra (preco, Sessao_id, Usuario_id, numCartao)" +
					"VALUES (?, ?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
			fillPreparedStatement(st, compraNaoMarcada);
			st.execute();
			ResultSet rs = st.getGeneratedKeys();
			rs.next();
			compraNaoMarcada.setId(rs.getInt(1));
			st.close();
			
			st = getConnection().prepareStatement(
					"INSERT INTO CompraNaoMarcada (Compra_id, numCadeira)" +
					"VALUES (?, ?)");
			st.setInt(1,compraNaoMarcada.getId());
			st.setInt(2,compraNaoMarcada.getNumCadeirasCompradas());		
			st.execute();
			st.close();
		}catch(Throwable e){
			throw new DaoException(e);
		}
	}


	private void fillCompra(CompraNaoMarcada compraNaoMarcada, ResultSet rs) throws SQLException{
		SessaoDao sessaoDAO = new SessaoDao();
		UsuarioDao usuarioaDAO = new UsuarioDao();
		
		compraNaoMarcada.setId(rs.getInt("id"));
		compraNaoMarcada.setNumCartaoCredito(rs.getString("numCartao"));
		compraNaoMarcada.setPreco(rs.getDouble("preco"));
		
		compraNaoMarcada.setSessao(sessaoDAO.get(rs.getInt("Sessao_id")));
		compraNaoMarcada.setUsuario(usuarioaDAO.get(rs.getInt("Usuario_id")));
		compraNaoMarcada.setNumCadeirasCompradas(rs.getInt("numCadeira"));
	}
	
	private void fillPreparedStatement(PreparedStatement st, CompraNaoMarcada compraNaoMarcada) throws SQLException{
			st.setDouble(1,compraNaoMarcada.getPreco());
			st.setInt(2,compraNaoMarcada.getSessao().getId());
			st.setInt(3,compraNaoMarcada.getUsuario().getId());
			st.setString(4,compraNaoMarcada.getNumCartaoCredito());
	}
}
